package presentacion;

import java.awt.BorderLayout;
import negocio.*;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JLabel;
import javax.swing.*;
import java.awt.Color;
import java.awt.Font;
import javax.swing.ImageIcon;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.Toolkit;
import java.awt.Dimension;

public class GUIModifEstadistica extends JDialog {

	private JPanel contentPane;
	private JTable _tablaModifEst;
	private TransferPublicidad _datos;
	private String _tipoOperacion;
	private JDialog _guiNuevoDato, _guiMuestraResult;
	private DefaultTableModel _modeloTabla;
	private String[] _clases = null;
	JButton bGuardar;
	/**
	 * Create the frame.
	 */
	public GUIModifEstadistica( DefaultTableModel modelo, TransferPublicidad datos) {
		
		//nueva instancia de datos al ppio de todo
		_datos = datos;
		
		setIconImage(Toolkit.getDefaultToolkit().getImage("logo_pato.png"));
		setTitle("Editar Datos Estadistica");
		setModal(true);
		setRootPaneCheckingEnabled(false);
		
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setBounds(100, 100, 657, 362);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(0, 35, 641, 249);
		contentPane.add(scrollPane);
		
		_tablaModifEst = new JTable();
		_tablaModifEst.setModel(modelo);
		_tablaModifEst.getTableHeader().setReorderingAllowed(false); 
		scrollPane.setViewportView(_tablaModifEst);
		
		JLabel lblOperacion = new JLabel("Operacion:");
		lblOperacion.setBounds(10, 295, 60, 14);
		contentPane.add(lblOperacion);
		
		final JLabel lOperacion = new JLabel("Porcentaje por clases");
		lOperacion.setForeground(Color.BLUE);
		lOperacion.setBounds(80, 295, 115, 14);
		contentPane.add(lOperacion);
		
		/***************** BOTON GUARDAR *****************/
		/* Primero se borran los datos de las estadisticas y luego se 
		guardan los datos que haya en la tabla, asi me evito tener que parsear
		en caso de que se eliminen algunas cosas de la tabla*/
		bGuardar = new JButton("");
		bGuardar.setEnabled(false);
		bGuardar.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				
				//Recogida de datos
				if (_datos.getOperacion().equals("Medidas estandar")) {
					
					double[] datosEst = new double[_modeloTabla.getRowCount()];
					for (int i = 0; i < _modeloTabla.getRowCount(); i++)
						datosEst[i] = Double.parseDouble(_modeloTabla.getValueAt(i, 0).toString());
					_datos.setEstEstandar(datosEst);
				}
				else if (_datos.getOperacion().equals("Moda")) {
					String[][] datosEst = new String[_modeloTabla.getRowCount()][2];
					for (int i = 0 ; i < _modeloTabla.getRowCount(); i++) {
						datosEst[i][0] = _modeloTabla.getValueAt(i, 0).toString();
						datosEst[i][1] = _modeloTabla.getValueAt(i, 1).toString();
					}
					_datos.setEstConClases(datosEst);
				}
				else {
					String[][] datosEst = new String[_modeloTabla.getRowCount()][3];
					for (int i = 0 ; i < _modeloTabla.getRowCount(); i++) {
						datosEst[i][0] = _modeloTabla.getValueAt(i, 0).toString();
						datosEst[i][1] = _modeloTabla.getValueAt(i, 1).toString();
						datosEst[i][2] = _modeloTabla.getValueAt(i, 2).toString();
					}
					_datos.setEstConClases(datosEst);
				}
				
				SingletonControlador.getInstancia().evento(Evento.PUBLI_GUARDA_ESTADISTICA, _datos);
				bGuardar.setEnabled(false);
			}
		});
		bGuardar.setIcon(new ImageIcon(GUIModifEstadistica.class.getResource("/imagesPath/guardar.png")));
		bGuardar.setMinimumSize(new Dimension(33, 9));
		bGuardar.setMaximumSize(new Dimension(33, 9));
		bGuardar.setBounds(516, 1, 40, 32);
		contentPane.add(bGuardar);
		
		/************************************************************/
		/* 					CALCULAR ESTADISTICAS                   */
		/************************************************************/
		JButton bMostrarResultText = new JButton("Calcular Resultado");
		bMostrarResultText.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				_datos = new TransferPublicidad();
				_datos.setOperacion(lOperacion.getText());
				
				//Segundo el tipo de operacion meto los datos en diferentes sitios
				if ( lOperacion.getText().equals("Medidas estandar") ) {
					
					double[] datEst = new double[_modeloTabla.getRowCount()];
					for (int i = 0; i < _modeloTabla.getRowCount(); i++)
						datEst[i] = Double.parseDouble(_modeloTabla.getValueAt(i, _modeloTabla.getColumnCount()-1).toString());
					_datos.setEstEstandar(datEst);
				}
				else if ( lOperacion.getText().equals("Moda") ){
					String[][] datEst = new String[_modeloTabla.getRowCount()][2];
					for (int i = 0; i < _modeloTabla.getRowCount(); i++) {
						datEst[i][0] = _modeloTabla.getValueAt(i, 0).toString();
						datEst[i][1] = _modeloTabla.getValueAt(i, 1).toString();
					}
					_datos.setEstConClases(datEst);
				}
				else { //porcentaje por clases
					String[][] datEst = new String[_modeloTabla.getRowCount()][3];
					for (int i = 0; i < _modeloTabla.getRowCount(); i++) {
						datEst[i][0] = _modeloTabla.getValueAt(i, 0).toString();
						datEst[i][1] = _modeloTabla.getValueAt(i, 1).toString();
						datEst[i][2] = _modeloTabla.getValueAt(i, 2).toString();
					}
					_datos.setEstConClases(datEst);
				}
				
				SingletonControlador.getInstancia().evento(Evento.PUBLI_CALCULA_EST, _datos);
				
				_guiMuestraResult = new GUIMuestraResultEstadistica();
				((GUIMuestraResultEstadistica)_guiMuestraResult).setResultados(_datos.getResultado());
				_guiMuestraResult.setVisible(true);
			//	JOptionPane.showMessageDialog(new JTextArea(), _datos.getResultado() );
			}
		});
		bMostrarResultText.setBounds(484, 291, 147, 23);
		contentPane.add(bMostrarResultText);
		
		/***************** BOTON NUEVO DATO ***********/
		JButton bNuevoDato = new JButton("");
		bNuevoDato.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				if (_tipoOperacion.equals("Porcentaje por clase"))
					_guiNuevoDato = new GUINuevoDatoEst(0, _clases);
				else if ( _tipoOperacion.equals("Moda") )
					_guiNuevoDato = new GUINuevoDatoEst(1, _clases);
				else 
					_guiNuevoDato = new GUINuevoDatoEst(2, _clases);
				
				// Recorrer la tabla y coger todas las clases menos las duplicadas
				_clases = new String[_modeloTabla.getRowCount()];
				for (int i = 0, j = 0; i < _modeloTabla.getRowCount(); i++)
					if ( !esta(_clases, _modeloTabla.getValueAt(i, 0).toString() ) ) {
						_clases[i] = _modeloTabla.getValueAt(i,0).toString();
						j++;
					}
				_datos.setClases(_clases);
				((GUINuevoDatoEst)_guiNuevoDato).setModeloTabla(_modeloTabla);
				((GUINuevoDatoEst)_guiNuevoDato).setDatos(_datos);
				((GUINuevoDatoEst)_guiNuevoDato).setRefBotonGuardar(bGuardar);
				((GUINuevoDatoEst)_guiNuevoDato).cargarClases();
				_guiNuevoDato.setVisible(true);
			}
		});
		bNuevoDato.setIcon(new ImageIcon(GUIModifEstadistica.class.getResource("/imagesPath/anhadir.png")));
		bNuevoDato.setFont(new Font("Microsoft Sans Serif", Font.PLAIN, 11));
		bNuevoDato.setBounds(558, 1, 40, 32);
		contentPane.add(bNuevoDato);
		
		/***************** BOTON ELIMINAR ****************/
		JButton bEliminarDato = new JButton("");
		bEliminarDato.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				try {
					_modeloTabla.removeRow(_tablaModifEst.getSelectedRow());
					bGuardar.setEnabled(true);
				}
				catch (ArrayIndexOutOfBoundsException exc) {
					JOptionPane.showMessageDialog(new JTextArea(), "No se ha seleccionado ninguna fila");
				}
			}
		});
		bEliminarDato.setIcon(new ImageIcon(GUIModifEstadistica.class.getResource("/imagesPath/eliminar.png")));
		bEliminarDato.setFont(new Font("Microsoft Sans Serif", Font.PLAIN, 11));
		bEliminarDato.setBounds(599, 1, 40, 32);
		contentPane.add(bEliminarDato);
		
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowOpened(WindowEvent arg0) {
				lOperacion.setText(_tipoOperacion);	
				SingletonControlador.getInstancia().evento(Evento.PUBLI_CARGA_DATOS_ESTADISTICA, _datos);
				if (_tipoOperacion.equals("Medidas estandar")) {
					double[] datos = _datos.getEstEstandar();
					for (int i = 0; i < datos.length; i++)
						_modeloTabla.addRow(new Object[]{datos[i]});
				}
				else if (_tipoOperacion.equals("Moda")) {
					String[][] datos = _datos.getEstConClases();
					for (int i = 0; i < datos.length; i++) 
						_modeloTabla.addRow(new Object[]{datos[i][0], datos[i][1]});
				}
				else {
					String[][] datos = _datos.getEstConClases();
					for (int i = 0; i < datos.length; i++) 
						_modeloTabla.addRow(new Object[]{ datos[i][0], datos[i][1], datos[i][2] });
				}
			}
		});
	}
	
	public void setTipoOperacion( String op ) { _tipoOperacion = op; }
	public void setModeloTabla (DefaultTableModel modelo) { _modeloTabla = modelo; }
	
	private static boolean esta( String[] array, String str){
		for (int i = 0; i < array.length; i++)
			if ( array[i] == str )
				return true;
		return false;
	}
}
